Laravel是一个优雅的框架,但并不代表你写的业务代码也同样优雅。
你的代码中是否还存在如下类似代码:
//是否绑定
if (isset($param['bind']) and $param['bind'] != '-1') {
$t = $param['bind'] == 1 ? '!=' : '=';
$rs = $rs->where('user_id', $t, 0);
}
//是否激活
if (isset($param['active_time']) and $param['active_time'] != '-1') {
$t = $param['active_time'] == 1 ? '>=' : '<';
$rs = $rs->where('active_time', $t, '1999-01-01');
}
if (isset($param['dealer']) && !empty($param['dealer'])) {
$rs = $rs->whereHas('dealer', function ($query) use ($param) {
$query->where('name', 'like', '%'.$param['dealer'] . '%')
->orWhere('dealer_id', '=', $param['dealer']);
});
}
当业务需求要加多个查询条件的时候,往往需要改前端页面和后端页面,前端加input框,后端加if条件。
本文分享下l5-repository(原作者) / l5-repository(本文作者改后)插件,ps:虽然目前原作者已不维护了,不过貌似招了些自愿者去维护,不影响基本使用。这里提到了两个l5插件,主要介绍下后者,改动的部分可以很好支持此插件。
repository模式
此插件实现了repository层,业务逻辑相关的代码放在repository中实现,所有的repository继承公共repository,公共repository继承\Prettus\Repository\Eloquent\BaseRepository
,repository模式不了解的点这里。
控制器
控制器方面只需简单的2行即可,插件会解析请求参数,但是解析的是特定形式的查询参数,如: /users?search=user_name:133;created_at:2018-01-01,2018-01-17&searchFields=user_name:like;created_at:between
。
public function index(Request $request)
{
$this->userRepository->pushCriteria(new RequestCriteria($request));
$users= $this->userRepository->paginate();
}
视图
视图方面原作者只是举了几个例子,并没提供相关js去拼成后端识别的格式,所以想依靠控制器两行代码简化查询还得做些工作,本文作者不忍心这插件由于这点瑕疵而弃用,于是自己fork了个然后写了一坨jquery去支持它。于是,视图代码如下即可:
{{-- 搜索本表的user_name字段 data-search-type="like":模糊搜索 --}}
<input data-search-type="like" name="user_name" type="text">
{{-- 搜索关联表的联系电话字段 --}}
<input data-search-type="like" name="userAddress.tel" type="text">
{{-- 创建区间查询 created_at between '2018-01-01' and '2018-01-17' --}}
<input data-search-type=">=" data-is-between="1" name="created_at" type="text">
<input data-search-type="<=" data-is-between="1" name="created_at" type="text">
写的那段jquery便可自动将表单参数拼成l5-repositoy识别的格式,后续加新的筛选条件只要前端加input即可。
结语
第一次分享技术文,有写的不到位的地方欢迎指出,谢谢~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。